iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0

雖然之前musl-libc的部份尚有pthread的canceling point仍有bug,但是撐起基礎的Linux userspace環境已經是勉強會動的狀態。
為了避免這系列變成debug流水帳,我們在循環帶過musl-libc porting的施作心法(使用qemu linux-user,配合不同層級的測試,一步一步逼進可以使用的狀態),先暫時將主題拉向後續的topic:開放的RISC-V 32bit 平台。

如之前小弟任職的公司人員,與外面無數文章所述,RISC-V並不是「開放原始碼」而是「開放的規格」,雖然很多人可能不以為意,但是一個訂得好的CPU/指令集規格,會直接影響到硬體實做的方便與否、以及軟體是否可以優雅地支援它。而這樣的know-how,過去不僅為專利所束縛、也因為缺乏討論而僅有少數人能掌握。但是現在RISC-V的出現,帶來了新的一波開放原始碼softcore實做,其中一套非常有名的,叫做VexRiscv,它由瑞士裔工程師 Charles Papon 在業外時間打造,為目前開放原始碼RV32 CPU core實做中,唯一同時具有SMP擴展性與MMU支援的實做。其plugin的設計,也使得剪裁VexRiscv core變得非常方便而彈性,從最極簡的RV32I、沒有cache,到RV32GC-MSU w/ 32Kb L1/L2 cache,幾乎各種使用性都能被囊括其中。

然而,有了CPU core本身是不足夠的,一個完整的application processor/MCU上面,我們還會需要各種週邊裝置,例如最基本的 UART、 memory controller/phy,到SDC/MMC甚或是Ethernet MAC,然而,過去,這些peripheral IP多半都由商業公司所開發、其RTL code (Verilog/VHDL ......) 都是閉源的,也通常是非常綁死在特定phy上面。但這件事情,在法裔工程師 Florent Kermarrec 自己開的小工作室,enjoy-digital陸續開源自己的SoC實做時,獲得了非常巨大的躍進。LiteX計畫是Florent在接了各種案子後,對於Verilog/VHDL這類傳統HDL的開發極為僵硬,很難在不同CPU core之間migration的深痛惡絕後,改以Migen這個Python-based的Hardware Domain specific languag而撰寫的SoC builder與數種數位IP實做。(先以極為彈性的scripting language撰寫好了行為定義、後續再轉為synthesizable verilog) 它的設計是透過定義了一套CSR bus[1],來統合它上面的各式peripheral與CPU core的,另外它也提供自己的interrupt處理機制[2],讓CPU core可以很輕鬆地被整合進去這樣的SoC框架之中。而這計畫的初試啼聲,乃是香港一間硬體新創,在發現FPGA公司Lattice以相當寬鬆的授權釋放出了其32bit的CPU core:Lattice Mico32時,決定用一套開放原始碼的方式,來打造TV set top box,即便最後該計畫沒有達成商業目標,但也站穩了開發的完整度。

一如當年Linux kernel與GNU生態系的結盟,彼此因為互相有不同的背景知識與職能,最後在聯合開發動能之下,我們獲得了一個完整的作業系統,LiteX與VexRiscv;兩個原本完全不同初衷的計畫,最後結合成為了RISC-V 32bit世界中,打遍天下無敵手的終極開源方案。

然而,好聽話也就說到這邊XD

紅標字樣:有自己的〝interrupt 處理機制〞,是的沒錯,LiteX/VexRiscv這邊有兩個比較亂的狀態,在單核時代時,它並不完全符合現行的RISC-V UNIX platform spec,他需要自己的irqchip driver支援[3]。設計上也非常的簡單暴力,直接定義了兩個custom CSR : 0xdc00x9c0 [3],分別代表pending的irq、以及irq enable mask,timer的部份則透過他自己SBI實做、來進行處理;但進入到VexRiscvSMP時,他們串接上了完整的PLIC/CLINT,這也造成了一些玩LiteX/VexRiscv的人對它的理解隨著時期不一樣而有差距的主因。筆者在作大綱規劃時,剛好就在一個過渡期,所以在開篇引言時,有說道會有kernel platform conforming的問題要處理。但這件事情在此時已經獲得緩解。

結束了這次的簡介,我們在下一章將會帶過如果建置一個完整的開源EDA + Litex/VexRiscv 環境來打造一開屬於你的RV32 Linux-capable SoC.

[1] https://github.com/enjoy-digital/litex/wiki/CSR-Bus
[2] https://github.com/enjoy-digital/litex/wiki/LiteX-for-Hardware-Engineers#interrupts-aka-events
[3] https://github.com/litex-hub/linux/blob/2669e46c615f2029c81d247c3782d004decac4b0/drivers/irqchip/irq-litex-vexriscv.c


上一篇
musl libc 簡介與其 porting(六)Busy Box Band
下一篇
LiteX/VexRiscv 簡介與使用 (二) 始有晝夜
系列文
Port Alpine Linux to open source RISC-V platform30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言